var arrPosicao					= new Array(11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88);
var arrTipo						= new Array(0, 1, 2, 3, 4, 2, 1, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 1, 2, 3, 4, 2, 1, 0);
var intPecasCarregadas			= 0;
var intPecaDrag					= 0;
var intMesaId					= 0;
var intJogadorId				= 0;
var blnPodeJogar				= false;
var strMinhaCor					= "";
var itvAguadarJogador			= 0;
var intDelayAguardarJogador		= 2000;
var itvGetMove					= 0;
var intDelayGetMove				= 2000;

$(window).resize(function() {
	PosicionaTudo();
});

$(function(){
	Array.prototype.clone = function () {var a = new Array(); for (var p in this) a[p] = this[p]; return a;}
	PosicionaTudo();
	SetaDrag();
	Conectar();
});

function SetaDrag() {
	for (var i = 0; i < 32; i++) {
		$("#peca_" + i).draggable({
			start:DragStart,
			stop:DragStop
		});
	}
}

function DragStart(event, ui) {
	var $objPeca		= $(ui.helper.context);
	var strPecaId		= ui.helper.context.id;
	var intPecaIndex	= strPecaId.substring(strPecaId.indexOf("_") + 1, strPecaId.length + 1);
	var intCasaOriginal = arrPosicao[intPecaIndex];

	for (var x = 1; x <= 8; x++) {
		for (var y = 1; y <= 8; y++) {
			if (ValidaMovimento($objPeca, intPecaIndex, intCasaOriginal, String(x) + String(y), true)) {
				if (getPecaByPos(String(x) + String(y)) != -1) {
					$("#posicao_" + String(x) + String(y)).css("background-color", "#FF8C8C");
				} else {
					$("#posicao_" + String(x) + String(y)).css("background-color", ((((y + (x - 1)) % 2) == 0)?'#FFCC66':'#FFFF99'));
				}
			}
		}
	}

}

function DragStop(event, ui) {
	var $objPeca		= $(ui.helper.context);
	var intLeft			= ui.offset.left + ($objPeca.width() / 2);
	var intTop			= ui.offset.top + ($objPeca.height() / 2);
	var intCasa			= getCasaTabuleiro(intLeft, intTop);
	var strPecaId		= ui.helper.context.id;
	var intPecaIndex	= strPecaId.substring(strPecaId.indexOf("_") + 1, strPecaId.length + 1);
	var intCasaOriginal = arrPosicao[intPecaIndex];

	//tira o highlight das casas validas
	for (var x = 1; x <= 8; x++) {
		for (var y = 1; y <= 8; y++) {
			$("#posicao_" + String(x) + String(y)).css("background-color", ((((y + (x - 1)) % 2) == 0)?'#9966FF':'#FFF'));
		}
	}

	if (!ValidaMovimento($objPeca, intPecaIndex, intCasaOriginal, intCasa, true)) {
		MovePeca($objPeca, intCasaOriginal);
	} else {
		blnPodeJogar = false;

		for (var i = 0; i < 32; i++) {
			if (arrPosicao[i] == intCasa){ //come
				Come(i);
				arrPosicao[i] = 0;
				break;
			}
		}

		arrPosicao[intPecaIndex] = intCasa;
		MovePeca($objPeca, intCasa);

		$.ajax({
			type: "POST",
			url: "../ajax.php",
			data: "m=Move&mesa_id=" + intMesaId + "&jogador_id=" + intJogadorId + "&casa_original=" + intCasaOriginal + "&casa=" + intCasa,
			success: function(r) {
				var blnRetorno = eval(r);
				if (blnRetorno) {
					AddStatus("Movimento: " + intCasaOriginal + " >> " + intCasa);
					AddStatus("Aguardando jogada do adversário...");
					itvGetMove = setInterval("GetMove();", intDelayGetMove);
				} else {
					AddStatus("Movimento inválido."); //fazer voltar atraz, descomer
					blnPodeJogar = true;
				}
			}
		});

	}
}

function InvertePosicao(intPosicao) {
	var strPosicao = String(intPosicao);
	var intX = 9 - parseInt(strPosicao.substr(0, 1));
	var intY = strPosicao.substr(strPosicao.length - 1, 1);
	return String(intX) + String(intY);
}

function GetMove() {
	$.ajax({
		type: "POST",
		url: "../ajax.php",
		data: "m=GetMove&mesa_id=" + intMesaId + "&jogador_id=" + intJogadorId,
		success: function(r) {
			var objR = eval('(' + r + ')');
			if (objR.novo_move) {
				clearInterval(itvGetMove);
				objR.posicao_origem		= InvertePosicao(objR.posicao_origem);
				objR.posicao_destino	= InvertePosicao(objR.posicao_destino);

				//verifica e come se necessario
				for (var i = 0; i < 32; i++) {
					if (arrPosicao[i] == objR.posicao_destino) {
						Come(i);
						arrPosicao[i] = 0;
						break;
					}
				}

				//identifica a peca movida
				intPecaIndex = 0;
				for (var i = 0; i < 32; i++) {
					if (arrPosicao[i] == objR.posicao_origem) {
						intPecaIndex = i;
						break;
					}
				}

				arrPosicao[intPecaIndex] = objR.posicao_destino;
				MovePeca($("#peca_" + intPecaIndex), objR.posicao_destino);

				AddStatus("Movimento: " + objR.posicao_origem + " >> " + objR.posicao_destino);
				AddStatus("É sua vez a jogar...");
				blnPodeJogar = true;
			}
		}
	});
}

function Come(intPecaIndex) {
	$("#peca_" + intPecaIndex).animate(
		{
			left:"0px", 
			top:"0px"
		},
		500, 
		function() { }
	);
}

function getPecaTypeByIndex(intPecaIndex) {
	return arrTipo[intPecaIndex];
}

function ValidaMovimento($objPeca, intPecaIndex, strPosicaoOrigem, strPosicaoDestino, blnValidaCheck) {

	//valida se é a vez do jogador
	if (!blnPodeJogar) {
		return false;
	}

	//valida se a posicao de destino é uma casa
	if (strPosicaoDestino == 0)	{
		return false;
	}

	//valida se a posicao de origem é diferente da posicao de destino
	if (strPosicaoOrigem == strPosicaoDestino) {
		return false;
	}

	//valida se a peca jogada pertence ao jogador
	if (!(minhaPeca($objPeca))) {
		return false;
	}

	//pega o index da peca que está na casa de destino
	var intPecaComidaIndex = getPecaByPos(strPosicaoDestino);

	//se existe peca a ser comida
	if (intPecaComidaIndex != -1) {

		//pega a peca que está na casa de destino
		var $objPecaComida = $("#peca_" + intPecaComidaIndex);

		//valida se a peca a ser comida é do jogador
		if (minhaPeca($objPecaComida)) {
			return false;
		}

	}

	//pega o tipo da peca
	var intType = getPecaTypeByIndex(intPecaIndex);

	//pega o x e y de origem e destino
	var intOrigemX = parseInt(String(strPosicaoOrigem).substr(0, 1));
	var intOrigemY = parseInt(String(strPosicaoOrigem).substr(1, 1));
	var intDestinoX = parseInt(String(strPosicaoDestino).substr(0, 1));
	var intDestinoY = parseInt(String(strPosicaoDestino).substr(1, 1));

	//varivel para validacao dos movimentos
	var blnMovimento = true;

	//torre
	if (intType == 0) {

		//valida se está na mesma linha ou coluna
		if ((intOrigemX != intDestinoX) && (intOrigemY != intDestinoY)) {
			blnMovimento = false;
		} else {
			//valida se não está pulando nenhuma peca
			if (intOrigemX == intDestinoX) {
				blnMovimento = (intervaloVazioY(intOrigemX, intOrigemY, intDestinoY));
			} else {
				blnMovimento = (intervaloVazioX(intOrigemY, intOrigemX, intDestinoX));
			}
		}

	//cavalo
	} else if (intType == 1) {

		//valida se o movimento foi feito em L
		blnMovimento =	(
							((intOrigemX == (intDestinoX + 1)) && (intOrigemY == (intDestinoY - 2))) || 
							((intOrigemX == (intDestinoX + 2)) && (intOrigemY == (intDestinoY - 1))) || 
							((intOrigemX == (intDestinoX + 2)) && (intOrigemY == (intDestinoY + 1))) || 
							((intOrigemX == (intDestinoX + 1)) && (intOrigemY == (intDestinoY + 2))) || 
							((intOrigemX == (intDestinoX - 1)) && (intOrigemY == (intDestinoY - 2))) || 
							((intOrigemX == (intDestinoX - 2)) && (intOrigemY == (intDestinoY - 1))) || 
							((intOrigemX == (intDestinoX - 2)) && (intOrigemY == (intDestinoY + 1))) || 
							((intOrigemX == (intDestinoX - 1)) && (intOrigemY == (intDestinoY + 2)))
						);

	//bispo
	} else if (intType == 2) {

		//valida se não está na mesma linha ou coluna
		if ((intOrigemX == intDestinoX) || (intOrigemY == intDestinoY)) {
			blnMovimento = false;
		} else {
			if (intOrigemX > intDestinoX) {
				var intDiferencaX = intOrigemX - intDestinoX;
			} else {
				var intDiferencaX = intDestinoX - intOrigemX;
			}
			if (intOrigemY > intDestinoY) {
				var intDiferencaY = intOrigemY - intDestinoY;
			} else {
				var intDiferencaY = intDestinoY - intOrigemY;
			}
			//valida se o movimento foi na diagonal
			if (intDiferencaX != intDiferencaY) {
				blnMovimento = false;
			} else {
				//valida se não está pulando nenhuma peca
				blnMovimento = (intervaloVazioZ(intDiferencaX, intOrigemX, intOrigemY, intDestinoX, intDestinoY));
			}
		}

	//dama
	} else if (intType == 3) {

		//verifica se o movimento é reto
		if ((intOrigemX == intDestinoX) || (intOrigemY == intDestinoY)) {
			//valida se não está pulando nenhuma peca
			if (intOrigemX == intDestinoX) {
				blnMovimento = (intervaloVazioY(intOrigemX, intOrigemY, intDestinoY));
			} else {
				blnMovimento = (intervaloVazioX(intOrigemY, intOrigemX, intDestinoX));
			}
		} else {
			if (intOrigemX > intDestinoX) {
				var intDiferencaX = intOrigemX - intDestinoX;
			} else {
				var intDiferencaX = intDestinoX - intOrigemX;
			}
			if (intOrigemY > intDestinoY) {
				var intDiferencaY = intOrigemY - intDestinoY;
			} else {
				var intDiferencaY = intDestinoY - intOrigemY;
			}
			//valida se o movimento foi na diagonal
			if (intDiferencaX != intDiferencaY) {
				blnMovimento = false;
			} else {
				//valida se não está pulando nenhuma peca
				blnMovimento = (intervaloVazioZ(intDiferencaX, intOrigemX, intOrigemY, intDestinoX, intDestinoY));
			}
		}

	//rei
	} else if (intType == 4) {

		//valida se o movimento foi de 1 casa para qualquer direcao
		blnMovimento =	(
							((intOrigemX == intDestinoX) && (intOrigemY == (intDestinoY - 1))) || 
							((intOrigemX == (intDestinoX + 1)) && (intOrigemY == (intDestinoY - 1))) || 
							((intOrigemX == (intDestinoX + 1)) && (intOrigemY == intDestinoY)) || 
							((intOrigemX == (intDestinoX + 1)) && (intOrigemY == (intDestinoY + 1))) || 
							((intOrigemX == intDestinoX) && (intOrigemY == (intDestinoY + 1))) || 
							((intOrigemX == (intDestinoX - 1)) && (intOrigemY == (intDestinoY + 1))) || 
							((intOrigemX == (intDestinoX - 1)) && (intOrigemY == intDestinoY)) || 
							((intOrigemX == (intDestinoX - 1)) && (intOrigemY == (intDestinoY - 1)))
						);

	//peao
	} else if (intType == 5) {

		//valida o movimento Y-1 ou Y-2 caso seja o primeiro movimento do peao
		if ((intOrigemY == intDestinoY) && ((intOrigemX == (intDestinoX + 1)) || ((intOrigemX == 7) && (intOrigemX == (intDestinoX + 2))))) {

			//valida se existe peca na casa de destino
			if (intPecaComidaIndex != -1) {
				blnMovimento = false;
			}

			//se vai andar duas casas
			if (intOrigemX == (intDestinoX + 2)) {
				//valida se existe peca entre a origem e o destino
				if (getPecaByPos(String((intDestinoX + 1)) + String(intOrigemY)) != -1) {
					blnMovimento = false;
				}
			}

		} else {
			//se existe peca a ser comida
			if (intPecaComidaIndex != -1) {
				//valida se está andando na diagonal
				blnMovimento = ((intOrigemX == (intDestinoX + 1)) && ((intOrigemY == (intDestinoY + 1)) || (intOrigemY == (intDestinoY - 1))));
			} else {
				blnMovimento = false;
			}
		}

	}

	//se for para validar o check e se o movimento for valido
	if ((blnValidaCheck) && (blnMovimento)) {
		var arrIPosicao = arrPosicao.clone();
		var arrITipo	= arrTipo.clone();

		//simula a jogada para verificar se o jogador estara em check apos jogar
		for (var i = 0; i < 32; i++) {
			if (arrIPosicao[i] == strPosicaoDestino){
				arrIPosicao[i] = 0;
				break;
			}
		}
		arrIPosicao[intPecaIndex] = strPosicaoDestino;

		//valida se o jogador continuara em check apos a jogada
		blnMovimento = ((!(IsCheck(arrIPosicao, arrITipo))));
	}

/*
en passam
roque
check

blnValidaCheck
*/

	return blnMovimento;
}

function IsCheck(arrIPosicao, arrITipo) {
	var blnCheck = false;

	//encontra o index do rei
	for (var i = 0; i < 32; i++) {
		if (arrITipo[i] == 4) {
			var intIndexRei = i;
			break;
		}
	}

	//inverte a cor para testar comer o rei com uma peca adversaria
	strMinhaCor = ((strMinhaCor == "branca")?"preta":"branca");

	//testa comer o rei
	for (var i = 0; i < 32; i++) {
		if (arrPosicao[i] != 0) {
			if (ValidaMovimento($("#peca_" + i), i, arrPosicao[i], intIndexRei, false)) {
				blnCheck = true;
				break;
			}
		}
	}

	//desinverte a cor
	strMinhaCor = ((strMinhaCor == "branca")?"preta":"branca");

	return blnCheck;
}

function intervaloVazioX(intY, intOrigemX, intDestinoX) {
	if (intOrigemX < intDestinoX) {
		var intStart = intOrigemX;
		var intEnd = intDestinoX;
	} else {
		var intStart = intDestinoX;
		var intEnd = intOrigemX;
	}
	for (var x = (intStart + 1); x < intEnd; x++) {
		if (getPecaByPos(parseInt(String(x) + String(intY))) != -1) {
			return false;
		}
	}
	return true;
}

function intervaloVazioY(intX, intOrigemY, intDestinoY) {
	if (intOrigemY < intDestinoY) {
		var intStart = intOrigemY;
		var intEnd = intDestinoY;
	} else {
		var intStart = intDestinoY;
		var intEnd = intOrigemY;
	}
	for (var y = (intStart + 1); y < intEnd; y++) {
		if (getPecaByPos(parseInt(String(intX) + String(y))) != -1) {
			return false;
		}
	}
	return true;
}

function intervaloVazioZ(intDiferenca, intOrigemX, intOrigemY, intDestinoX, intDestinoY) {
	var intDeslocamentoX = ((intOrigemX < intDestinoX)?1:-1);
	var intDeslocamentoY = ((intOrigemY < intDestinoY)?1:-1);
	for (var i = 1; i < intDiferenca; i++) {
		if (getPecaByPos(parseInt(String(intOrigemX + (intDeslocamentoX * i)) + String(intOrigemY + (intDeslocamentoY * i)))) != -1) {
			return false;
		}
	}
	return true;
}

function minhaPeca($objPeca) {
	return ($objPeca.attr("src").indexOf(strMinhaCor) != -1);
}

function getPecaByPos(intPosicao) {
	for (var i = 0; i < 32; i++) {
		if (arrPosicao[i] == intPosicao) {
			return i;
		}
	}
	return -1;
}

function getCasaTabuleiro(intLeft, intTop) {
	var $objTabuleiro	= $("#tabTabuleiro");
	var $objTabOffset	= $objTabuleiro.offset();
	var intTabWidth		= $objTabuleiro.width();
	var intTabHeight	= $objTabuleiro.height();
	var intPecaWidth	= intTabWidth / 8;
	var intPecaHeight	= intTabHeight / 8;
	if ((intLeft < $objTabOffset.left) || (intLeft > ($objTabOffset.left + intTabWidth)) || (intTop < $objTabOffset.top) || (intTop > ($objTabOffset.top + intTabHeight))) {
		return 0;
	}
	for (var x = 1; x <= 8; x++) {
		if ((intLeft > $objTabOffset.left) && (intLeft < ($objTabOffset.left + (x * intPecaWidth)))) {
			for (var y = 1; y <= 8; y++) {
				if ((intTop > $objTabOffset.top) && (intTop < ($objTabOffset.top + (y * intPecaHeight)))) {
					return String(y) + String(x);
				}
			}
		}
	}
	return 0;
}

function PosicionaTudo() {
	var $objStatus		= $("#txtStatus");
	var $objTabuleiro	= $("#divTabuleiro");
	var $objTabOffset	= $objTabuleiro.offset();

	$objStatus.css("left", $objTabOffset.left + "px");
	$objStatus.css("top", ($objTabOffset.top - $objStatus.height() - 10) + "px");
	$objStatus.fadeIn();

	PosicionaTodasPecas();
}

function PosicionaTodasPecas() {
	for (var i = 0; i < 32; i++) {
		PosicionaPeca($("#peca_" + i), arrPosicao[i]);
	}
}

function PosicionaPeca($objPeca, intPosicao) {
	var $objOffset = $("#posicao_" + intPosicao).offset();
	$objPeca.css("left", (parseInt($objOffset.left) + 2) + "px");
	$objPeca.css("top", (parseInt($objOffset.top) + 2) + "px");
}

function MovePeca($objPeca, intPosicao) {
	var $objOffset = $("#posicao_" + intPosicao).offset();
	$objPeca.animate(
		{
			left:parseInt($objOffset.left) + 2 + "px", 
			top:parseInt($objOffset.top) + 2 + "px"
		},
		250, 
		function() { }
	);
}

function InicializaTabuleiro() {
	AddStatus("Inicializando tabuleiro...");
	$("#peca_0").attr("src", "../_img/peca/preta/torre.gif");
	$("#peca_1").attr("src", "../_img/peca/preta/cavalo.gif");
	$("#peca_2").attr("src", "../_img/peca/preta/bispo.gif");
	$("#peca_3").attr("src", "../_img/peca/preta/dama.gif");
	$("#peca_4").attr("src", "../_img/peca/preta/rei.gif");
	$("#peca_5").attr("src", "../_img/peca/preta/bispo.gif");
	$("#peca_6").attr("src", "../_img/peca/preta/cavalo.gif");
	$("#peca_7").attr("src", "../_img/peca/preta/torre.gif");
	for (var i = 8; i < 16; i++) {
		$("#peca_" + i).attr("src", "../_img/peca/preta/peao.gif");
	}
	$("#peca_24").attr("src", "../_img/peca/branca/torre.gif");
	$("#peca_25").attr("src", "../_img/peca/branca/cavalo.gif");
	$("#peca_26").attr("src", "../_img/peca/branca/bispo.gif");
	$("#peca_27").attr("src", "../_img/peca/branca/dama.gif");
	$("#peca_28").attr("src", "../_img/peca/branca/rei.gif");
	$("#peca_29").attr("src", "../_img/peca/branca/bispo.gif");
	$("#peca_30").attr("src", "../_img/peca/branca/cavalo.gif");
	$("#peca_31").attr("src", "../_img/peca/branca/torre.gif");
	for (var i = 16; i < 24; i++) {
		$("#peca_" + i).attr("src", "../_img/peca/branca/peao.gif");
	}
}

function pecaLoad(objThis) {
	intPecasCarregadas++;
	if (intPecasCarregadas == 32) {
		for (var i = 0; i < 32; i++) {
			$("#peca_" + i).fadeIn(800);
		}
	}
}

function AddStatus(strTexto) {
	$objStatus = $("#txtStatus");
	$objStatus.val($objStatus.val() + strTexto + "\n");
	$objStatus.animate({ scrollTop: $objStatus.height() }, 1000);
}

function InverteTabuleiro() {
	arrPosicao	= Array(81, 82, 83, 84, 85, 86, 87, 88, 71, 72, 73, 74, 75, 76, 77, 78, 21, 22, 23, 24, 25, 26, 27, 28, 11, 12, 13, 14, 15, 16, 17, 18);
	PosicionaTodasPecas();
}

function Conectar() {
	AddStatus("Conectando no servidor...");
	AddStatus("Verificando se existe sala aberta...");

	$.ajax({
		type: "POST",
		url: "../ajax.php",
		data: "m=IniciaJogo",
		success: function(r) {
			var objR = eval('(' + r + ')');
			intMesaId		= objR.mesa_id;
			intJogadorId	= objR.jogador_id;
			if (objR.nova == 1) {
				strMinhaCor = "branca";
				AddStatus("Abrindo sala...");
				AddStatus("Aguardando adversário...");
				itvAguadarJogador = setInterval("AguardaJogador();", intDelayAguardarJogador);
			} else {
				strMinhaCor = "preta";
				AddStatus("Entrando na sala (" + intMesaId + ")...");
				InverteTabuleiro();
				InicializaTabuleiro();
				AddStatus("É a vez de seu adversário...");
				AddStatus("Aguardando jogada do adversário...");
				itvGetMove = setInterval("GetMove();", intDelayGetMove);
			}
		}
	});
}

function AguardaJogador() {
	$.ajax({
		type: "POST",
		url: "../ajax.php",
		data: "m=TemJogador&mesa_id=" + intMesaId,
		success: function(r) {
			var objR = eval('(' + r + ')');
			if (objR.temjogador != 0) {
				AddStatus("O adversário conectou...");
				clearInterval(itvAguadarJogador);
				InicializaTabuleiro();
				AddStatus("É sua vez a jogar...");
				blnPodeJogar = true;
			}
		}
	});
}